package com.boxman;

import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Rect;

import java.io.InputStream;
import java.util.Locale;

// 基本游戏物体
class BaseGameObject {
    // 移动结果
    static class MoveResult {
        // 结果
        public enum Result {
            CANNOT_MOVE,        // 本身不具有移动能力
            NO_MOVE,            // 没有移动
            NORMAL_MOVED,       // 正常移动
            ARRIVED_ON_DEST,    // 移动到目标上
            LEFT_FROM_DEST      // 离开目标
        }
        
        public Result result = Result.CANNOT_MOVE;  // 移动结果
    }

    // 类型
    public enum Type {
        NOTHING,        // 什么也没有
        WALL,           // 墙
        BACKGROUND,     // 背景
        DESTINATION,    // 箱子的目的地
        BOX,            // 箱子
        MAN             // 小人
    }

    protected Canvas mDrawer;   // 绘图者
    protected Bitmap mImage;    // 图片
    protected Type mType;       // 类型
    protected int mX;           // 横向坐标
    protected int mY;           // 纵向坐标
    public static int sSize;    // 尺寸

    /**
     * 构造方法。
     * @param assetManager  资单管理者
     * @param drawer        绘图者
     * @param type          类型
     * @param x, y          左上角坐标
     */
    public BaseGameObject(AssetManager assetManager, Canvas drawer, Type type, int x, int y) {
        // 初始化成员
        mDrawer = drawer;
        mType = type;
        mX = x; 
        mY = y;

        // 加载图片
        try {
            final String imageFilePath = String.format(Locale.getDefault(), Const.IMAGE_FILE_PATH, type.ordinal());
            final InputStream inputStream = assetManager.open(imageFilePath);
            mImage = BitmapFactory.decodeStream(inputStream);
        } catch (Exception e) {
            e.printStackTrace();
        }

        // 绘制自身
        this.draw();
    }

    /**
     * 绘制自身。
     */
    public void draw() {
        final Rect srcRect = new Rect(0, 0, mImage.getWidth(), mImage.getHeight());
        final Rect dstRect = new Rect(mX * sSize, mY * sSize, (mX + 1) * sSize, (mY + 1) * sSize);
        mDrawer.drawBitmap(mImage, srcRect, dstRect, null);
    }

    /**
     * 获取类型。
     * @return 类型
     */
    public Type getType() {
        return mType;
    }

    /**
     * 移动。
     * @param direction     方向
     * @param moveResult    移动结果
     * @return 被推动的箱子
     */
    public BaseGameObject move(int direction, MoveResult moveResult) {
        moveResult.result = MoveResult.Result.CANNOT_MOVE;
        return null;
    }
}
